查看原文
其他

精度、耗时、显存消耗、网络结构...一行代码深度解析训练性能指标!

将AI进行到底的 百度AI 2023-03-16

深度学习以网络结构繁杂参数多著称,这导致开发者在模型训练过程中难免遇到调参方向不明和性能消耗难以优化等问题,大幅降低开发效率,因此模型训练调优的过程也被业界戏称为“炼丹”。随着深度学习技术在各行各业的渗透愈来愈深,如何缩短深度学习产业落地的耗时成为了近年来大家尤为关注的问题。

正所谓“工欲善其事,必先利其器”, 一个能实时监控模型训练指标、硬件性能消耗情况、可视化网络结构和每层网络参数变化的工具可大幅缩减模型开发时间,推动人工智能技术快速应用落地。

飞桨可视化分析工具 VisualDL 以丰富的图表及清晰的可视化解析功能帮助开发者直观地理解深度学习模型训练过程中的各项信息:

▎指标监控

标量、PR 曲线、ROC 曲线组件,可以帮助用户观察损失函数的变化以及评价模型效果。


▎样本呈现

样本数据(图像、文本、音频)组件,可以帮助用户对训练时输入的样本进行直观地查看。


▎模型理解

直方图、高维数据降维展示、超参数组件,可以帮助用户理解训练过程,如分析模型参数的分布是如何随着训练过程变化,模型某一层输出的张量的变化趋势,分析 embedding 的距离关系以及对比不同超参数对模型效果的影响等。


▎结构调试

网络结构组件,可以帮助用户分析模型的拓扑结构,查看模型各个张量的流向,验证组网的准确性。


▎性能调优

性能分析组件,可以帮助用户分析模型的执行性能,定位性能瓶颈。


⬇️项目链接:
https://github.com/PaddlePaddle/VisualDL‍


‍不仅如此,VisualDL v2.4 全面升级,新增动态图模型结构可视化性能分析两大功能,为开发者带来了更强大的模型辅助开发能力:

▎新增功能一:动态图模型可视化

针对动态图组网的层级结构特性,支持模型开发者按层级可视化模型结构。模型的节点可以折叠和展开,每一个层级节点即是组网时候所用的 nn.Layer,相比于静态图模型可视化时只能以框架底层的 Op 为节点,动态图可视化可以让开发者将展示的模型结构和所写的组网代码一一对应起来,为开发者验证组网的准确性提供了便利。

▎新增功能二:性能分析

对飞桨框架导出的性能数据提供可视化支持,新增 Overview、Operator、GPU Kernel、Distributed、Trace、Memory 共六个视图的数据分析。开发者可以获取到模型运行的每个阶段(如前向、反向)的执行时间、框架算子的执行时间、GPU 计算 Kernel 的时间、显存分配和释放的时间和大小等,这些信息既可以用于判断性能瓶颈,也可以用于验证执行了某个性能优化方案后的效果。

下面让我们详细看看两大新增功能是如何赋能模型的高效开发。


动态图可视化


在本次功能升级之前,用户想要使用 VisualDL 可视化模型结构,只能可视化静态图格式的模型。然而静态图格式的模型结构中不存在模型的层级信息,只有以框架底层的 Op 为单个节点的信息。对于习惯使用动态图的用户而言,所展示的模型结构并不能直观地能和所定义的网络层(nn.Layer)对应起来,导致开发者无法直观便捷地将模型结构与代码关联起来,增加了使用成本。

为了解决这一问题,VisualDL 的 LogWriter(数据采集的类)新增了 add_graph 接口,使用该接口,用户只需传入所定义的 nn.Layer 动态图模型即可以导出模型结构并按照动态图组网的层级结构方式进行可视化。add_graph 接口会自动分析并生成网络的层级信息,通过分析这些层级信息,来支持动态地展开和折叠节点,以及显示展开或者折叠后的节点输入和输出的张量流向关系。


动态图可视化当前提供的操作包括支持展开和折叠单个节点、一键展开和折叠全部结点、高亮数据流向、节点搜索,你可以方便地将结构和组网代码对应起来,并且对于飞桨内置的 nn.Layer,还支持点击跳转到官网的 API 说明文档,快来体验一下它给调试模型结构带来的方便吧。

⬇️文档链接:
https://github.com/PaddlePaddle/VisualDL/blob/develop/docs/components/README_CN.md#graph--%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84%E7%BB%84%E4%BB%B6


性能分析


飞桨框架从 v2.3.0 开始支持通过使用 paddle.profiler 来收集模型运行时的性能数据并导出,模型的性能数据由在框架中记录的各种类别的事件构成。如 Operator 类型的事件记录的是框架中算子执行的信息,Kernel 类型的事件记录的是设备侧如 GPU 中 Kernel 执行计算的信息。

VisualDL 本次加入性能分析功能,替用户解析并可视化性能数据,从多个不同的视角来分析程序的执行性能。目前共提供 Overview、Operator、GPU Kernel、Distributed、Trace、Memory 共六个视图的数据分析。

Overview 视图——展示了模型性能的总览情况,你可以获取到设备的利用率、模型执行各个阶段(如 Dataloader, Forward, Backward)所消耗的 CPU 和 GPU 时间、每个阶段内框架内记录的各种事件的次数和时间以及使用打点接口自定义记录的事件的时间,帮助你把握程序整体执行情况。

Operator 视图——展示框架内算子的执行情况,你可以获取到框架内算子的执行次数和耗时、算子的输入张量的 shape 等信息以及它们的耗时占比关系。

GPU Kernel 视图——展示计算设备(如 GPU)上 Kernel 的执行情况,你可以获取到 Kernel 的执行次数和耗时、Kernel 的其它属性以及它们的耗时占比关系。

Distributed视图——展示分布式程序中通信(Communication)、计算 (Computation)以及这两者 Overlap 的时间,结合 Trace 视图你可以获取到通信和计算之间的并行关系。

Trace 视图——展示记录的所有事件的时间线 timeline,你可以直观看到框架内记录的所有性能事件所发生的时间序列,了解整个程序的执行过程。

Memory 视图——展示存储分配以及释放的情况,你可以直观看到框架管理的内存和显存随着时间的变化情况,以及每次分配或释放内存所发生的地址和时间,并会根据发生时间来对应相应的事件,以便定位该存储操作发生的位置。


我们以最常见的数据读取瓶颈为例,看看性能分析功能是如何在性能调优中发挥作用的。使用默认参数下的 Dataloader,开启框架的性能分析功能(使用方式可参考飞桨官网使用指南之模型性能分析),导出性能分析数据,然后开启 VisualDL 可视化数据。

此时,从 Overview 视图和 Trace 视图中看模型的整体执行信息,发现 Dataloader 时间占比明显异常,该部分明显可以进行优化。为了解决数据读取带来的性能瓶颈,打开 Dataloader 的多进程异步读取数据功能,通过将 Dataloader 的 num_workers 参数设置为4之后,再次导出数据并查看 Overview 视图和 Trace 视图,可以看到 Dataloader 部分时间占比明显得到改善(从占比36.04%下降到0.15%),整体执行速度也获得了极大提升(每个 Step 的平均时间从 554ms 下降到了 352ms,GPU 利用率从58%上升到了91%)。


上述的简单案例展示了性能分析工具是如何提供数据指标来辅助开发者进行性能调优的,不同的性能瓶颈可能需要从不同的视图中去获取数据指标进行判断,但是在性能分析方面,使用 VisualDL 一定能够助你一臂之力!

VisualDL 作为飞桨的可视化分析工具,一直致力于帮助开发者们进行高效的模型调试调优,解决开发者的工具需求,欢迎大家多多使用与尝试!

⬇️文档链接:
https://github.com/PaddlePaddle/VisualDL/blob/develop/docs/components/profiler/README_CN.md

⬇️项目链接:
https://github.com/PaddlePaddle/VisualDL

扫描下方二维码关注公众号,填写问卷即可入群
*Tips:所有福利都在群公告中,等大家来获取!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存